package com.hydl.power.mqtt;


import com.hydl.power.service.MqttDataService;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 发布消息的回调类
 * <p>
 * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
 * 每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。
 * 在回调中，将它用来标识已经启动了该回调的哪个实例。
 * 必须在回调类中实现三个方法：
 * <p>
 * public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
 * <p>
 * public void connectionLost(Throwable cause)在断开连接时调用。
 * <p>
 * public void deliveryComplete(MqttDeliveryToken token))
 * 接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
 * 由 MqttClient.connect 激活此回调。
 */
@Component
public class PushCallback implements MqttCallback {

    @Autowired
    private MqttDataService mqttDataServiceAuto;
    private static MqttDataService mqttDataService;  //静态对象;
    @PostConstruct
    public void init(){
        mqttDataService = this.mqttDataServiceAuto;  //将注入的对象交给静态对象管理
    }

    @Override
    public void connectionLost(Throwable cause) {
        //System.out.println("连接断开，可以做重连");
        Client client=new Client();
        client.start();
        // 连接丢失后，一般在这里面进行重连
        //System.out.println("66666666666666666666");
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面
        //System.out.println("接收消息主题 : " + topic);
       // System.out.println("接收消息Qos : " + messxiage.getQos());
       // System.out.println("接收消息内容 : " + new String(message.getPayload()));
        try {
//            MqttDataService mqttDataService = SpringContextUtil.getBean(MqttDataService.class);
            mqttDataService.save(new String(message.getPayload()));
        } catch (Exception e) {
            e.printStackTrace();
        }



//        Thread thread = new Thread(new Runnable() {
//            @Override
//            public void run() {
////                JSONObject jsonObject = JSONObject.parseObject(new String(message.getPayload()));
//
//            }
//        });
//        thread.run();

    }


}
